import cv2 as cv


def imshow(windowName, img):
    # 创建一个窗口
    cv.namedWindow(windowName, cv.WINDOW_NORMAL)  # 使用cv2.WINDOW_NORMAL允许改变大小
    cv.imshow(windowName, img)
    # 调整窗口大小
    cv.resizeWindow(windowName, 1000, 600)  # 宽度800，高度600


# cv2.IMREAD_COLOR：默认参数，以彩色图像的方式读取图像文件。
# cv2.IMREAD_GRAYSCALE：以灰度图像的方式读取图像文件。
# cv2.IMREAD_UNCHANGED：以原始图像的方式读取图像文件，包括图像的alpha通道。
img_color = cv.imread("image/07.jpg", cv.IMREAD_COLOR)
imshow("img_color", img_color)

# 图片转灰色
grey_img = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
imshow("grey_img", grey_img)

# 阈值处理 + 自动设置阈值
t, thresh_img = cv.threshold(grey_img, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
# 自动获取的阈值
print("自动获取的阈值", t)
imshow("thresh_img", thresh_img)

# 滤波器处理杂色
median_img = cv.medianBlur(thresh_img, 89)
imshow("median_img", median_img)

# 边缘检测
canny_img = cv.Canny(median_img, 0, 123, None, 3, True)
imshow("canny_img", canny_img)

# 获取轮廓
cont, ct = cv.findContours(canny_img, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
print(len(cont))
# 过滤我们想要的轮廓
contours_list = []
# 中心点坐标列表
moments_list = []
for a in range(len(cont)):
    # 获取轮廓面积，获取我们想要的轮廓
    area = cv.contourArea(cont[a])
    print(area)
    if 200 < area  :
        contours_list.append(cont[a])
        # 获取中心点
        moment = cv.moments(cont[a])
        moments_list.append(moment)

for b in range(len(moments_list)):
    m0= moments_list[b]['m00']
    if m0 == 0:
        m0 = 1
    x = int(moments_list[b]['m10']/m0)
    y = int(moments_list[b]['m01']/m0)
    # print(f'x{x},y{y}')
    cv.rectangle(img_color, (x,y),(x,y), [255,255,41] , 5)


# 绘制轮廓到指定的图
cv.drawContours(img_color, contours_list, -1, (255, 255, 41), 2)
imshow("dw_color", img_color)

cv.waitKey()
cv.destroyAllWindows()
